/* Copyright (c) 2011 Alexandre Défossez, Timothée Lacroix
 * This file is part of HINAPT.
 *
 * HINAPT is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HINAPT is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HINAPT.  If not, see <http://www.gnu.org/licenses/>.
 */


 /*!
  \file oflow.hpp
  Implémentation d'un tracker basé sur le flot optique et la méthode pyramidale
  itérative de Lucas Kanade
 */

#ifndef OFLOW_HPP_INCLUDED
#define OFLOW_HPP_INCLUDED

#include "_tracker.hpp"

/*!
  Permet de tracker plusieurs points avec le flot optique. Modifie la position
  des points en place.
  \param[in,out] toTrack les points à suivre
  \param imgA la première image
  \param imgB l'image suivante
  \param profMax la profondeur maximale pour la pyramidisation
  \param n le nombre d'itération lors de la méthode de Newton
  \param w la demi-taille de la fenêtre de suivi
  \param threshold le seuil pour pour s'arrêter avant n itération
  \return true si l'opération a réussi, false sinon
*/
bool trackMulti(std::vector<Point2f>& toTrack,Mat& imgA,Mat& imgB,
                int profMax=3, int n=5,
                int w=7, double threshold=0.1);

/*!
  Calcul le flot optique, c'est à dire le vecteur
  de déplacement du point (x,y), entre l'image imgA
  et imgB, les paramètres optionnels permettant de régler la
  finesse du calcul
  \see trackMulti
  \param imgsA les images pyramidisées de la première image
  \param imgsB les images pyramidisées de l'image suivante
  \param x l'abscisse du point à suivre
  \param y l'ordonnée du point à suivre
  \param profMax
  \param n
  \param w
  \param threshold
  \param prof prodondeur actuelle
*/
Vec2d opticalFlowSimple(Mat imgsA[], Mat imgsB[],
                        double x, double y,
                        int profMax, int n,
                        int w, double threshold,int prof=0);



/*!
  Calcul G, le gradient spatial, en (x,y)
  \param img l'image
  \param[out] g le gradient spatial, une matrice 2x2
  \param x l'abscisse du point
  \param y l'ordonnée du point
  \param w la demi-taille de la fenêtre de calcul
*/
void calcG(Mat& img, Mat& g, double x, double y, int w);

#endif // OFLOW_HPP_INCLUDED
